iT邦幫忙

2025 iThome 鐵人賽

DAY 13
0
Software Development

AI 慣老闆的 AI 學習歷程 - AI 時代的軟體工程的反思系列 第 13

AI 慣老闆的 AI學習日記 Day 12 - 第三方登入整合失敗:OAuth2/Identity 基礎(Callback 設錯,人人卡登入)

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20250816/20142509vagbs2ErPm.png

場景: 週一早上,正式上線十分鐘。

貝老闆:「好消息!我跟客戶說我們支援 Google、LINE、Apple 登入了,今天就要 demo!」

小可:「等等,我這邊點登入一直跳錯誤……『invalid_client』?『redirect_uri_mismatch』?!」

貝老闆:「怎麼可能,我昨晚在 Replit 測過啊,AI 都說 OK!」

(電話撥給好威)

好威:「先深呼吸。你把正式站的 Callback 設成 http://localhost:3000/auth/callback,是不是?」

貝老闆:「啊? 那是啥?我跟 AI 都有測試過了啊!?」

小可:「現在所有使用者卡在登入頁,客服電話快炸了。」

好威:「五分鐘救火包:1) 關掉第三方,先開臨時本地帳號;2) 設正確的 Redirect URI(含協定、網域、路徑、無多餘斜線);3) 先把 statenonce 打開,之後我再解釋。

好威:「還記得 Day 3 的『環境差異』嗎?DevProd 一定要分開:網域一定走 HTTPSClient ID/SecretRedirect URI 各自一組,別把 localhost 當正式站,也不要把 Dev 金鑰偷偷放到 Prod。之後我們把這些設成環境變數與 IaC,PR 才看得出差異。」」

好威解析

第三方登入不是魔法,是一套嚴格的交換禮儀。你(Client)拿著 Client ID/SecretAuthorization Server 借用使用者的身分,授權結束,對方只會把憑證送回你事先登記的門口,也就是 Redirect URI。門牌號碼一個字不同、http/https 搞錯、子網域不對、路徑多一條斜線,通通被擋。今天就是典型的 Callback 設錯導致全面登入失敗。

概念拆解

1) Redirect URI 白名單與環境管理

重點: OAuth 供應商(如 Google、LINE、Apple)只會把授權結果回傳到你事先登記的 Redirect URI。協定、網域、Port、路徑、大小寫與尾斜線都要一模一樣,並區分 Local / Staging / Prod 三套。建議把這些值寫進環境變數與 IaC 檔(如 Terraform),加上 PR 审核。錯一字=全站登不進來。
如何問 AI:「請幫我列出 Google / LINE / Apple 在 Local、Staging、Prod 的 Redirect URI 白名單表,產生 .env 範例與 Terraform 片段,並提醒我常見錯誤(協定、尾斜線、子網域)。」

(擴充)Dev/Prod 憑證分離與最小權限

重點: Dev 與 Prod 應使用不同專案/不同 OAuth 憑證(Client ID/Secret)與不同 Redirect URI。Prod 的憑證只配置到正式服務帳號與網域,權限最小化;Dev 可開寬一點,但必須避免共享帳號與共用金鑰。切記: 千萬不要把 Dev 的 Client Secret 上傳到 Repo 或複用到 Prod。
如何問 AI:「依我現在的雲端供應商,幫我產生『Dev 專案』與『Prod 專案』的建立腳本,包含 OAuth Client、Redirect URI 白名單與最小權限設定;同時輸出 .env.dev.env.prod 範本與 CI 檢查規則,阻擋混用。」

2) OAuth vs OIDC 與 Scope

重點: OAuth 核心是「授權」,OIDC(OpenID Connect)在其上加了 ID Token 做「身分」。要能識別使用者,Scope 至少包含 openid email profile,並驗證 ID Token 的簽章與 aud/iss/exp。若只拿到 Access Token 沒處理 ID Token,容易出現「有票沒身分」。
如何問 AI:「示範用我框架(Next.js、Django、FastAPI 任一)完成 OIDC 登入,驗簽 ID Token,取 sub/email,並處理 Token 失效與更新。」

3) 安全機制:state / nonce / PKCE / Cookie

重點: state 防 CSRF、nonce 防重放,PKCE 保護公用客戶端(前端 App)。登入後把 Session/Tokens 放 httpOnly、secure Cookie,避免 localStorage 被 XSS 拿走。記得開 HTTPS,並設定合理的 Token 期限與旋轉策略。
如何問 AI:「請產生安全預設的登入流程:啟用 state、nonce、PKCE,回傳設為 httpOnly secure Cookie,並給我 Playwright E2E 測試腳本。」


Takeaways

A. 先做最小可用的身分系統:先確保有一條可用的「後門」:系統管理員本地帳號+強密碼+限制 IP。當第三方登入炸裂時,營運不至於全停。把這條路寫進 Runbook,客服有話術,工程有切換開關(Feature Flag)。與 AI 協作時可要求產生 $Admin Seed + 切換策略$。

B. 設定即文件,文件即程式:把 Redirect URI、Scope、Provider 設定用 IaC 管理,PR 才能 Code Review。把 .env.exampleterraform/*.tfdocs/identity.md 串成一套。請 AI 生成清單+檢查腳本,CI 內建「環境對齊」檢查,避免 Local 設定偷偷飄到 Prod。

C. 自動化驗收登入:用 Playwright / Cypress 寫一條從「點登入」→「授權」→「回到站內看到使用者名稱」的 E2E 測試,CI 每次部署都跑。也請 AI 幫你造假帳號與測試資料,確保不同 Provider、不同環境、不同瀏覽器都能通過。


小工具/範例片段

# .env.example(片段)
OAUTH_PROVIDER=google
REDIRECT_URI_LOCAL=http://localhost:3000/api/auth/callback
REDIRECT_URI_STAGING=https://staging.example.com/api/auth/callback
REDIRECT_URI_PROD=https://app.example.com/api/auth/callback
SCOPES="openid email profile"

今日提問

你們的 Redirect URI 白名單現在有列齊 Local / Staging / Prod 嗎?是否有跑過一條自動化的登入 E2E 測試?留言分享你最常踩的 OAuth 地雷。

小作業 Prompt:

「請根據我的網域與架構,產生 Google、LINE、Apple 的 Redirect URI 白名單表(Local/Staging/Prod),輸出 .env、Terraform 片段與一段 Playwright 測試,並列出 10 個常見錯誤與如何排查。」


上一篇
AI 慣老闆的 AI學習日記 Day 11 - 客戶回報 Bug 工程師重現不了:「怎麼重現?」
下一篇
AI 慣老闆的 AI學習日記 Day 13 - i18n & 模組化——Prompt 直翻導致排版亂
系列文
AI 慣老闆的 AI 學習歷程 - AI 時代的軟體工程的反思34
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言